# 参数类型: 必需参数  关键字参数   默认参数   不定长参数
# 必需参数: 调用函数的时候必须以正确的顺序传参,实参和形参的数量保持一致

def demo(name, age):
    print("我的名字是:%s,年龄是:%d" % (name, age))


# demo("李连清",18)
# demo("程锦")  # TypeError: demo() missing 1 required positional argument: 'age' 
# demo(38,"程锦") # TypeError: %d format: a number is required, not str

# 关键字参数: 使用关键字参数时,允许函数调用的时候实参和形参的顺序不一致,使用关键字进行自动的匹配.

def test(name, age):
    print("姓名:%s,年龄:%d" % (name, age))


# test(age = 22,name="小菲")

# 默认参数: 在定义函数的时候,直接给形式参数赋值.
# 调用函数的时候,若传递了实参,则使用实参.若未传递实参,则使用默认参数.
# 注意:若定义函数时,有多个形参,一般把默认参数放在后面.

def jia(num1, num2=12):
    print(num1 + num2)


# jia(34,26)
# jia(28)

'''
默认参数放在前面,语法报错
def jian(n1 = 80,n2):
    print(n1-n2)
'''

# 不定长参数(可变参数): 
'''
*args:用于接收多个位置参数,   argments的简写,得到的形式是元组
**kwargs:用于接收多个关键字参数, keyword arguments的简写,得到的形式是字典
'''


def fn(*args):
    print(args)


# fn(12,34,54)
# fn(87,31)
# fn(89)


def fn1(**kwargs):  # **kwargs表示关键字参数,格式是 key=value这种形式
    print(kwargs)


fn1(x=12, y=87)
fn1(x=27, y=98, z=32)
fn1(x=39)
# fn1(87,34)  # TypeError: fn1() takes 0 positional arguments but 2 were given 

# 注意:在使用不定长参数时,若函数中有多个参数,一般把不定长参数放在列表的后面.
